package com.smartleanx.module.hrm.dal.dataobject.employee;

import lombok.*;

import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;

import com.baomidou.mybatisplus.annotation.*;
import com.smartleanx.framework.tenant.core.db.TenantBaseDO;
import net.bytebuddy.agent.builder.AgentBuilder;

/**
 * 员工 DO
 *
 * @author tengcj
 */
@TableName("hrm_employee")
@KeySequence("hrm_employee_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EmployeeDO extends TenantBaseDO {

    /**
     * 员工id
     */
    @TableId
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 手机
     */
    private String mobile;
    /**
     * 证件类型
     * <p>
     * 枚举 {@link TODO hrm_id_type 对应的类}
     */
    private Integer idType;
    /**
     * 证件号码
     */
    private String idNumber;
    /**
     * 性别
     * <p>
     * 枚举 {@link TODO system_user_sex 对应的类}
     */
    private Integer sex;
    /**
     * 最高学历
     * <p>
     * 枚举 {@link TODO hrm_highest_education 对应的类}
     */
    private Integer highestEducation;
    /**
     * 籍贯
     */
    private String nativePlace;
    /**
     * 出生日期
     */
    private LocalDateTime dateOfBirth;
    /**
     * 生日类型 1 阳历 2 农历
     * <p>
     * 枚举 {@link com.smartleanx.framework.common.enums.CalendarType}
     */
    private Integer birthdayType;
    /**
     * 生日（示例：0213）
     */
    private String birthday;
    /**
     * 入职时间
     */
    private LocalDateTime entryTime;
    /**
     * 转正日期
     */
    private LocalDateTime regularizationTime;
    /**
     * 计划离职日期
     */
    private LocalDateTime planSeparationTime;
    /**
     * 申请离职日期
     */
    private LocalDateTime applySeparationTime;
    /**
     * 离职类型 1 主动离职 2 被动离职 3 退休
     */
    private Integer separationType;
    /**
     * 离职原因 1家庭原因 2身体原因 3薪资原因 4交通不便 5工作压力 6管理问题 7无晋升机会 8职业规划 9合同到期放弃续签 10其他个人原因  11试用期内辞退 12违反公司条例 13组织调整/裁员 14绩效不达标辞退 15合同到期不续签 16 其他原因被动离职
     */
    private Integer separationReason;
    /**
     * 离职备注
     */
    private String separationRemarks;
    /**
     * 员工号
     */
    private String employeeNo;
    /**
     * 部门ID
     */
    private Long deptId;
    /**
     * 岗位id
     */
    private Long postId;
    /**
     * 直属上级ID
     */
    private Long leaderId;
    /**
     * 用户id
     */
    private Long userId;
    /**
     * 聘用形式
     * <p>
     * 枚举 {@link TODO hrm_employment_form 对应的类}
     */
    private Integer employmentForm;
    /**
     * 聘用类型
     * <p>
     * 枚举 {@link TODO hrm_employment_type 对应的类}
     */
    private Integer employmentType;
    /**
     * 员工状态
     * <p>
     * 枚举 {@link com.smartleanx.module.hrm.eums.employee.EmployeeStatusEnum}
     */
    private Integer state;
    /**
     * 试用期 0 无试用期
     * <p>
     * 枚举 {@link TODO hrm_probation_period 对应的类}
     */
    private Integer probationPeriod;
    /**
     * 工作地点
     */
    private String workAddress;
    /**
     * 是否已婚
     */
    private Boolean married;
    /**
     * 是否已育
     */
    private Boolean fertilized;
    /**
     * 健康状态
     */
    private Boolean healthStatus;
    /**
     * 现居地址
     */
    private String currentAddress;
    /**
     * 工资卡卡号
     */
    private String cardNumber;
    /**
     * 银行名称
     */
    private String bankName;
    /**
     * 开户行
     */
    private String openingBank;
    /**
     * 岗级id
     */
    private Long postLevelId;
    /**
     * 户籍地址
     */
    private String residenceAddress;
    /**
     * 个人邮箱
     */
    private String personalEmail;
    /**
     * 紧急联系人
     */
    private String emergencyContact;
    /**
     * 紧急联系人电话
     */
    private String emergencyContactNumber;

    @TableField(exist = false)
    private Integer isLeader;

    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private Integer dingUserId;

    @TableField(exist = false)
    private String dingUserName;

    // 【e签宝】实名认证状态（0-未实名，1-已实名）
    private Integer esignRealnameStatus;

    // 【e签宝】授权状态（0-未授权，1-已授权）
    private Integer esignAuthorizedStatus;

    // 【e签宝】账号ID
    private String esignPsnId;

    // 【e签宝】认证授权流程ID
    private String esignAuthFlowId;

    private Integer esignAuthorizedStatusWeb;

}
